//index.js是配置路由的地方
import Vue from "vue";
import VueRouter from "vue-router";

import routes from "./routes";
import store from '@/store'
//使用插件
Vue.use(VueRouter);
//先把VueRouter原型对象上的push方法先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

//重写push、 replace方法
//第一个参数：告诉原来的push方法 你往哪里跳转 以及传递哪些参数
// 第二个参数 成功的回调 第三个是失败的回调
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        //call与apply的区别，都可以调用函数一次 都可以改函数的上下文一次
        // 不同点：call传递参数用逗号隔开 apply方法执行 传递数组
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(
            this,
            location,
            () => {},
            () => {}
        );
    }
};
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(
            this,
            location,
            () => {},
            () => {}
        );
    }
};
//配置路由
let router = new VueRouter({
    //配置路由 routes 这里不能写错成routers
    routes,
    scrollBehavior(to, from, savedPosition) {
        // 始终滚动到顶部  y=0代表滚动条在最上方
        return {
            y: 0
        };
    },
});


//全局守卫 前置守卫 在路由跳转前进行判断 是否能跳
router.beforeEach(async (to, from, next) => {
    //to: 获取到要跳转到哪个路由的信息
    //from: 获取到从哪个路由而来的信息
    //next: 放行函数，
    //next()表示直接放行
    // next('/')表示放行到指定的路由当中
    //next(false) 中断
    //为了测试先全部放行
    //next()
    //用户登录了才会有token  未登录一定不会有token
    let token = store.state.user.token;
    //用户信息  userInfo至少是一个空对象 在if判断中永远为真
    let name = store.state.user.userInfo.name
    if (token) {
        //1.1 登录了，就不允许前往登录页
        if (to.path == '/login') {
            next('/home')
        } else { 
            // //1.2、因为store中的token是通过localStorage获取的，token有存放在本地
            // 当页面刷新时，token不会消失，但是store中的其他数据会清空，
            // 所以不仅要判断token,还要判断用户信息
            //1.2.1、判断仓库中是否有用户信息，有就放行，没有就派发actions获取信息
            if (name) {
                next()
            } else { 
                //1.2.2、如果没有用户信息，则派发actions获取用户信息
               
                try {
                    //获取用户信息成功  放行
                    await store.dispatch('getUserInfo')
                    next()
                    
                } catch (error) {
                    //1.2.3、获取用户信息失败，原因：token过期
                    //清除前后端token，跳转到登陆页面
                    await store.dispatch('userLogout')
                    next('/login')
               }
            }

       }
        
        
    } else { 
        //用户未登录，首页或登录页可以正常访问
        //不能去交易 支付相关以及个人中心
        let toPath = to.path
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            //把未登录的时候向去而没有去成的信息 存储于地址栏中
            next('/login?redirect=' + toPath)
        } else { 
            //去的不是上面这些路由 就放行
            next()
        }

    }
    

})
export default router;